<?php
	//实例化出模型对象
	//@param string $table  表名
	//return Object
	function M($table){
		return new Model($table);
	}
	function p($arg){
		echo "<pre>";
		print_r($arg);
		echo "</pre>";
	}
	//系统运行时间
	define("RUN_TIME",microtime(true));
	//3.1.php
	//文件加载
	function load($file=null){
		static $files =array();
		//如果没有传递任何参数，返回数组
		//if(null==null);//null与null可以比较，建议使用is_null()函数
		if(is_null($file)){
			return $files;
		}
		//序列化文件名
		$name = md5($file);
		//判断文件是否已经加载过
		if(isset($files[$name])){
			return true;
		}
		//$s = microtime(true);
		//加载文件 
		//区分大小写的文件检测 ，如果返回值为false表示文件不存
		if(!file_exists_case($file)){
			return false;
		}
		include $file;
		// echo microtime(true)."<br/>".RUN_TIME;exit;
		//得到文件加载成功的时间 比如说当前时间 08:01:01秒，文件加载用了0.22秒,$runtime值 为08:01:01.22秒   0.22
		$runtime =round(microtime(true)-RUN_TIME,3);
		//在静态数组中保存文件的信息
		$files[$name]=array(
			"time"=>$runtime,//加载时间
			"file"=>$file//文件名
		);
		return true;
	}
	//区分大小写的文件加载函数
	function file_exists_case($file){
		if(is_file($file)){
			//basename(realpath("FILE.php"))  获得磁盘实际的文件名称，也就是说如果磁盘上文件是小的，就返回小写
			//检测当前操作系统是不是WINDOWS
			if(strstr(PHP_OS,"WIN")){
				if(basename(realpath($file)) !=basename($file)){
					return false;
				}
			}
			return true;
		}
		return false;
	}
	//获得文件大小  GB MB  KB
	//@param $size 大小单位是字节
	//1222222323 b>kb >mb >GB>TB
	//1024*1024(kb)*1024(db)
	function get_size($size,$dec=3){
		switch(true){
			//是否大于GB
			case $size>pow(1024,3):
			 return round($size/pow(1024,3),$dec)."GB";
			//是否大于MB
			case $size>pow(1024,2):
			 return round($size/pow(1024,2),$dec)."MB";
			 //是否大于KB
			case $size>1024:
			 return  round($size/1024,$dec)."KB";
			default:
			 return $size."B";
		}
	}
	//获得目录大小
	function get_dir_size($dir){
		if(!is_dir($dir))return false;
		$files  = scandir($dir);//得到目录列表
		$size=0;
		foreach($files as $f){
			//过滤掉.与..目录
			if(in_array($f,array(".","..")))continue;
			$_file = $dir.'/'.$f;
			$size+=is_dir($_file)?get_dir_size($_file):filesize($_file);
		}
		return $size;
	}
	//删除目录或文件
	function del($dirname){
		//如果文件或目录不存在，不操作，返回false
		if(!file_exists($dirname))return false;
		//如果是文件，直接用unlink删除之
		if(is_file($dirname)){
			return unlink($dirname);
		}
		//对目录进行操作
		$fileArr = scandir($dirname); //第2层 f/dir
		foreach($fileArr as $f){
			if($f=='.' || $f=='..') continue;
			//给文件补全路径
			$_file = $dirname.'/'.$f;  // f/dir   第2层时  f/dir/z.txt
			is_dir($_file)?del($_file):unlink($_file);
		}
		return rmdir($dirname);
	}
	//不区分大小写的数据键检测
	function array_key_exists_d($key,$arr){
		$_key = strtolower($key);
		foreach($arr as $k=>$v){
			if($_key==strtolower($k)){
				return true;
			}
		}
		return false;
	}
	//$sdir 原目录
	//$ddir 目标目录
	//$stat 是否覆盖已经存在的文件    1 覆盖  0 不覆盖
	function copyDir($sdir,$ddir,$stat=0){
		//如果原目录不存在，返回fase 复制失败
		if(!is_dir($sdir))return false;
		is_dir($ddir) || mkdir($ddir);//如果目标目录不存在，创建他
		$files =scandir($sdir);//遍历原目录的所有内容
		foreach($files as $f){
			if($f=='.' || $f=='..') continue;
			$_sFile = $sdir.'/'.$f;//要复制的原文件  a/1.txt
			$_dFile = $ddir.'/'.$f;//目标文件 a2/1.txt
			if($stat==0 && is_file($_dFile))continue; //文件存在进是否覆盖
			is_dir($_sFile)?copyDir($_sFile,$_dFile):copy($_sFile,$_dFile);
		} 
		return true;
	}
	//递归更改数组的KEY（键名）
	//@param array 
	//@stat int  0 小写  1 大写
	function array_change_key_case_d($arr,$stat=0){
		$_newArr = array();//新数组
		$func = $stat?"strtoupper":"strtolower";
		if(!is_array($arr) || empty($arr)){
			return $_newArr;
		}
		foreach($arr as $k=>$v){
			$_k = $func($k);//通过变量函数转换KEY大小写
			$_newArr[$_k] = is_array($v)?array_change_key_case_d($v,$stat):$v;
		}
		return $_newArr;
	}
	//更改数组中值的大小写，支持多层数组
	//@param $arr array 操作的数组
	//@param $type int  更改方式   0 小写 1 大写
	function array_change_value($arr,$type=0){
		//大小写转换函数    变量函数特性
		$func = $type?"strtoupper":"strtolower";
		$_newArr = array();
		//如果不是数组或者为空  不操作返回空数组
		if(!is_array($arr) || empty($arr)){
			return $arr;
		}
		foreach($arr as $k=>$v){
			$_newArr[$k] = is_array($v)?array_change_value($v,$type):$func($v);
		}
		return $_newArr;
	}
	//读取与设置配置项
	//@param $name mixed 配置项的名称，如果不填写返回所有配置项
	//@param $value mixed 配置项的值
	function C($name=null,$value=null){
		//静态变量$config储存所有配置项
		static $config = array();
		if(is_null($name)){
			return $config;
		}
		//如果$name为数组则与静态变量$name合并
		if(is_array($name)){
			$config = array_merge($config,array_change_key_case_d($name,1));
		}
		//如果$name为字符串 2种情况   1 $value无值表示获得配置项   2 $value有值表示更改配置项
		if(is_string($name)){
			$name = strtoupper($name);
			//获得配置项
			if(is_null($value)){
				return array_key_exists_d($name,$config)?$config[$name]:null;
			}else{
				//设置配置的值
				$config[$name]=$value;
				return true;
			}
		}

	}
?>